<?php
/*
Author: Nicolas Zdanovicz
Date 20140325
User Data Access Class
*/
class DAOHorario{

    public static function getById($id){
        
         $db = getPDO();
         $sql = "select id,id_dia as dia,hora,duracion,capacidad,activo,activo_feriado as activoFeriado,id_profesor as profesor from horario where id = ?";
         $stmt = $db->prepare($sql);
         $ok = $stmt->execute(array($id));
         $obj = $stmt->fetchObject();
         
         $hor = null;
         if($obj!=null){
             $hor= DAOHorario::mapValues($obj);
         }
         else{
            throw new ENoDataFound("No se encontro el horario con el id ".$id);
         }
         
         return $hor;
    }
    
    public static function getAllJoined(){
    	 
    	$db = getPDO();
    	$sql = "select h.id,d.nombre as dia,h.hora,h.duracion,h.capacidad,h.activo,h.activo_feriado as activoFeriado,p.nombre as profesor from horario h inner join dias d on h.id_dia = d.id inner join profesor p on h.id_profesor = p.id order by h.id_dia asc, h.hora asc";
    	$stmt = $db->prepare($sql);
    	$ok = $stmt->execute();
    	$result = $stmt->fetchAll(\PDO::FETCH_OBJ);
    	$arrResult = array();
    
    	foreach($result as $row){
    		array_push($arrResult,DAOHorario::mapValues($row));
    	}
    	 
    	return $arrResult;
    }
    
    public static function getAllFullJoinedByUsr($from, $to, $idUsr){
    
    	
    	$from=date("Y-m-d 00:00:00",$from);
    	$to=date("Y-m-d 23:59:59",$to);
    	$db = getPDO();
    	$sql = "select h.id,d.nombre as dia,h.hora,h.duracion,h.capacidad,h.activo,h.activo_feriado as activoFeriado,p.nombre as profesor,
 				cl.id as claseId, ifnull(cl.vacantes,h.capacidad) as vacantes, cl.fecha as fechaClase, cl.usclId from horario h 
    			inner join dias d on h.id_dia = d.id 
				inner join profesor p on h.id_profesor = p.id 
				left join (select cl1.id, cl1.id_horario_clase, cl1.fecha, cl1.vacantes,uscl.id as usclId from clase cl1 left join (select id,id_clase from usuario_clase where id_usuario_web = ?) as uscl on cl1.id = uscl.id_clase where fecha between ? and ?)
    			as cl on cl.id_horario_clase = h.id 
				order by h.hora asc";
    	$stmt = $db->prepare($sql);
    	$ok = $stmt->execute(array($idUsr,$from,$to));
    	$result = $stmt->fetchAll(\PDO::FETCH_OBJ);
    	$arrResult = array();
    
    	foreach($result as $row){
    		array_push($arrResult,DAOHorario::mapValuesFullJoinedByUsr($row));
    	}
    
    	return $arrResult;
    }

    public static function getAllFullJoined($from, $to){
    
    	 
    	$from=date("Y-m-d 00:00:00",$from);
    	$to=date("Y-m-d 23:59:59",$to);
    	$db = getPDO();
    	$sql = "select h.id,d.nombre as dia,h.hora,h.duracion,h.capacidad,h.activo,h.activo_feriado as activoFeriado,p.nombre as profesor,
 				cl.id as claseId, ifnull(cl.vacantes,h.capacidad) as vacantes, cl.fecha as fechaClase from horario h 
    			inner join dias d on h.id_dia = d.id 
				inner join profesor p on h.id_profesor = p.id 
				left join (select cl1.id, cl1.id_horario_clase, cl1.fecha, cl1.vacantes from clase cl1 where fecha between ? and ?)
    			as cl on cl.id_horario_clase = h.id 
				order by h.hora asc";
    	
    	$stmt = $db->prepare($sql);
    	$ok = $stmt->execute(array($from,$to));
    	$result = $stmt->fetchAll(\PDO::FETCH_OBJ);
    	$arrResult = array();
    
    	foreach($result as $row){
    		array_push($arrResult,DAOHorario::mapValuesFullJoined($row));
    	}
    
    	return $arrResult;
    }
    
    public static function existeClaseInstanciada($from, $to, $idHorario){
    
    	 
    	$from=date("Y-m-d 00:00:00",$from);
    	$to=date("Y-m-d 23:59:59",$to);
    	$db = getPDO();
    	$sql = "select id from clase where id_horario_clase = ? and fecha between ? and ?";
    	$stmt = $db->prepare($sql);
    	$ok = $stmt->execute(array($idHorario,$from,$to));
    	$obj = $stmt->fetchObject();
    	
//     	echo json_encode(array($idHorario,$from,$to));
//     	return;
    	
    	$id = null;
    	if($obj!=null){
    		$id= $obj->id;
    	}
    	else{
    		$id = -1;
    	}
    	 
    	return $id;
    
    }


    public static function getAll(){
         
         $db = getPDO();
         $sql = "select id,id_dia as dia,hora,duracion,capacidad,activo, activo_feriado as activoFeriado,id_profesor as profesor from horario";
         $stmt = $db->prepare($sql);
         $ok = $stmt->execute();
         $result = $stmt->fetchAll(\PDO::FETCH_OBJ);
         $arrResult = array();    
        
         foreach($result as $row){             
             array_push($arrResult,DAOHorario::mapValues($row));
         }
         
        return $arrResult;
    }
    
    
    
    
    
    public static function add($horario){
        
         $db = getPDO();
          $sql = "insert into horario (id_dia,hora,duracion,capacidad,activo,activo_feriado,id_profesor) values ";
          $sql.= "(?,?,?,?,?,?,?)";
          $stmt = $db->prepare($sql);
          $ok = $stmt->execute(array($horario->getDia(),
									 $horario->getHora(),
									 $horario->getDuracion(),
									 $horario->getCapacidad(),
									 $horario->getActivo(),
          							 $horario->getActivoFeriado(),
									 $horario->getProfesor()));
        $horario->setId($db->lastInsertId());
        
         return $horario;        
    }
    
    public static function deleteById($id){
    
    	$db = getPDO();
    	$sql = "delete from horario where id = ?";
    	$stmt = $db->prepare($sql);
    	$ok = $stmt->execute(array($id));
    	return;
    }
    
    public static function update($horario){
    
    	$db = getPDO();
    	$sql = "update horario set id_dia = ? ,hora = ? ,duracion = ? ,capacidad = ? ,activo = ? ,activo_feriado = ?,id_profesor = ? where id =?";
    	$stmt = $db->prepare($sql);
    	$ok = $stmt->execute(array($horario->getDia(),
									 $horario->getHora(),
									 $horario->getDuracion(),
									 $horario->getCapacidad(),
									 $horario->getActivo(),
          							 $horario->getActivoFeriado(),
									 $horario->getProfesor(),
    								 $horario->getId()));
    	return;
    }
     
    private static function mapValues($obj){
        $hor = new Horario();
		
		$hor->setId($obj->id);
		$hor->setDia($obj->dia);
		$hor->setHora($obj->hora);
		$hor->setActivo($obj->activo);
		$hor->setActivoFeriado($obj->activoFeriado);
		$hor->setCapacidad($obj->capacidad);
		$hor->setDuracion($obj->duracion);
		$hor->setProfesor($obj->profesor);
        
        return $hor;
    }

    private static function mapValuesFullJoinedByUsr($obj){
    	$hor = new Horario();
    
    	$hor->setId($obj->id);
    	$hor->setDia($obj->dia);
    	$hor->setHora($obj->hora);
    	$hor->setActivo($obj->activo);
    	$hor->setActivoFeriado($obj->activoFeriado);
    	$hor->setCapacidad($obj->capacidad);
    	$hor->setDuracion($obj->duracion);
    	$hor->setProfesor($obj->profesor);
    	$hor->setClaseId($obj->claseId);
    	$hor->setVacantes($obj->vacantes);
    	$hor->setFechaClase($obj->fechaClase);
    	
    	
    	if($obj->usclId){
    		$hor->setReservadoUsuario("S");
    	}else{
    		$hor->setReservadoUsuario("N");
    	}
    
    	return $hor;
    }
    private static function mapValuesFullJoined($obj){
    	$hor = new Horario();
    
    	$hor->setId($obj->id);
    	$hor->setDia($obj->dia);
    	$hor->setHora($obj->hora);
    	$hor->setActivo($obj->activo);
    	$hor->setActivoFeriado($obj->activoFeriado);
    	$hor->setCapacidad($obj->capacidad);
    	$hor->setDuracion($obj->duracion);
    	$hor->setProfesor($obj->profesor);
    	$hor->setClaseId($obj->claseId);
    	$hor->setVacantes($obj->vacantes);
    	$hor->setFechaClase($obj->fechaClase);    	 
    
    	return $hor;
    }
    
}
?>